有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果数据已经存在,java Android Studio SQLite不会将数据插入数据库

我读这篇文章是因为我有同样的问题。我遵循并复制了潘文林的步骤,但我遇到了一个错误nullPointerException

在我的数据库助手中的某个地方。java

public Boolean verifyData(String TABLE_NAME, String id){
        String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ?";
        Cursor res = db.rawQuery(query, null);         <------------ LINE 42
    if (res.moveToFirst()){
        res.close();
        return true;
    }

    res.close();
    return false;

}
public long insertData(String name,String surname,String id){
    if (verifyData(TABLE_NAME, id)){            <------------ LINE 53
        return 0;
    }

    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
    Date date = new Date();
    Date time = new Date();

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_1, dateFormat.format(date));
    contentValues.put(COL_2, timeFormat.format(time));
    contentValues.put(COL_3, name);
    contentValues.put(COL_4, surname);
    contentValues.put(COL_5, id);
    long result=db.insert(TABLE_NAME, null, contentValues);
    return result;

}

在我的主要活动中的某个地方。java

public void AutoAdd(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
        String currentDateandTime = sdf.format(new Date());

LINE 329 ------> long isInserted = myDb.insertData(theName.getText().toString(), theSur.getText().toString(), theId.getText().toString());

    }

Logcat

2021-04-10 09:24:17.889 16707-16707/com.example.AppDraft3 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.AppDraft3, PID: 16707
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.AppDraft3/com.example.AppDraft3.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.database.Cursor 安卓.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
        at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3654)
        at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806)
        at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2267)
        at 安卓.os.Handler.dispatchMessage(Handler.java:107)
        at 安卓.os.Looper.loop(Looper.java:237)
        at 安卓.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.database.Cursor 安卓.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
        at com.example.AppDraft3.DatabaseHelper.verifyData(DatabaseHelper.java:42)
        at com.example.AppDraft3.DatabaseHelper.insertData(DatabaseHelper.java:53)
        at com.example.AppDraft3.MainActivity.AutoAdd(MainActivity.java:329)
        at com.example.AppDraft3.MainActivity.onCreate(MainActivity.java:86)
        at 安卓.app.Activity.performCreate(Activity.java:7963)
        at 安卓.app.Activity.performCreate(Activity.java:7952)
        at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3629)

共 (1) 个答案

  1. # 1 楼答案

    您需要添加一行来实例化变量/对象db,例如:

    public Boolean verifyData(String TABLE_NAME, String id){
            SQLiteDatabase db = this.getWritableDatabase(); //<<<<<<<<<< ADDED
            String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ''";
            Cursor res = db.rawQuery(query, null);         <       ERROR HEREEEEEEE
        if (res.moveToFirst()){
            res.close();
            return true;
        }
        res.close();
        return false;
    }
    

    但是,verifyData方法正在尝试提取传递的id为“”的记录,因此将始终返回false

    我相信你应该因此而改变

    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ''";
    

    致:

    String query = "SELECT * FROM " + TABLE_NAME + " WHERE id = '" + id + "'";
    

    如果id列被定义为唯一的(它可能应该是唯一的),那么作为方便的insert方法使用INSERT OR IGNORE的等价物,它将忽略重复的id并返回值-1,而不插入行(因此不需要verifyData方法)